#include "nf_thread.h"
#include "spi.h"
#include "TA_Protocol.h"
#include "Switch.h"
//信号量
rt_sem_t nf_tx_sem;
rt_sem_t nf_rx_sem;


nf_t nf02;
uint8_t TX_ADDRESS[5] = {0xA7,0xA6,0xA5,0xA4,0xA0};   //

TA_Protocol_TCB   ta_tcb;
#define           ta_data_buf_size     32
uint32_t          ta_data_buf[ta_data_buf_size];

#define nf_tx_mq_size 5*sizeof(nf_Send_Message_t)
struct rt_messagequeue nf_tx_mq;                      // ???????
static rt_uint8_t nf_tx_msg_pool[nf_tx_mq_size];      //????????????????

void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin)
{
	if(GPIO_Pin==GPIO_PIN_7)
	{
		NF_IRQ(&nf02);
		if(nf02.status.PRIM_RX)//接收模式
		{
			rt_sem_release(nf_rx_sem); //释放接收到数据信号量
//			Queue.Message_MemPool[5] = 0;
//			
//			rt_mq_send(nf_rx_mq,&Queue,sizeof(Queue));
		}
	}
}
/*******************************
 * 功能：DATA 线为IRQ模式
*******************************/
void IRQ_GPIO_Input()
{
	__HAL_RCC_GPIOA_CLK_ENABLE();
	GPIO_InitTypeDef GPIO_InitStruct = {0};
	  /*Configure GPIO pin : PtPin */
  GPIO_InitStruct.Pin = GPIO_PIN_7;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
/************************************
 * 功能：GPIO 端口函数及延时函数
 * 参数：
 * 返回：
 * *********************************/
uint8_t nf_gpio_and_delay(nf_t *nf,uint8_t msg, uint8_t arg_int,void *arg_ptr,void *res_arg_ptr)
{
	switch (msg)
	{
		case NF_MSG_DELAY_MILLI:
			//HAL_Delay(arg_int);
			rt_thread_mdelay(arg_int);
			break;
		case NF_MSG_GPIO_CS:              //CS引脚
			//rt_thread_mdelay(1);
			if(arg_int)
			{
				HAL_GPIO_WritePin(NF_CS_GPIO_Port,NF_CS_Pin,GPIO_PIN_SET);
			}
			else
			{
				HAL_GPIO_WritePin(NF_CS_GPIO_Port,NF_CS_Pin,GPIO_PIN_RESET);
			}
			break;
		case NF_MSG_GPIO_CE:             //CE引脚
			break;
		case NF_MSG_IRQ_MODEL:
			IRQ_GPIO_Input();
			break;
		case NF_MSG_DATA_MODEL:
			HAL_SPI_MspInit(&hspi1);
		  break;
		default:
			break;
	}
	return 1;
}
uint8_t spi_r[50];
/*******************************************
 * 功能：spi通信函数
 * 参数：
 * 返回：
 * ****************************************/
uint8_t  nf_4wire_hw_spi(nf_t *nf, uint8_t msg, uint8_t arg_int,void *arg_ptr,void *res_arg_ptr)
{
	switch(msg)
	{
		case NF_MSG_BYTE_SEND:
			HAL_SPI_TransmitReceive(&hspi1,(uint8_t *)arg_ptr,(uint8_t *)res_arg_ptr,arg_int,1000);
			break;
		case NF_MSG_BYTE_START_TRANSFER:
			break;
		case NF_MSG_BYTE_END_TRANSFER:
			break;
		case NF_MSG_BYTE_INIT:
			break;
		case NF_MSG_BYTE_Transmit:
			HAL_SPI_Transmit(&hspi1,(uint8_t *)arg_ptr,arg_int,1000);
		    break;
		case NF_MSG_BYTE_Receive:
		    HAL_SPI_Receive(&hspi1,(uint8_t *)arg_ptr,arg_int, 1000);
		    break;
		default:
			return 0;
	}
	return 1;
}

TA_BytesArray TA_Pares(TA_Protocol protocol,uint8_t *data)
{
	//LED_Link();
	TA_BytesArray BytesArray;
	//if(protocol.FrameType==0x01)
	//{
		HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_RESET);
		//UART2SendData(protocol.data,protocol.data_len);
	//}
	return BytesArray;
}
uint8_t rssi=0;
/********************************
 *功能：nrf接收线程入口函数
********************************/
uint8_t nf_data[32];
void nf_thread_entry(void *paremeter)
{
	nf_Send_Message_t send_message;
	nf_Setup_Ci24R1_noname_f(&nf02,nf_4wire_hw_spi,nf_gpio_and_delay);
	//创建nf发送消息队列 
	rt_mq_init(&nf_tx_mq,
               "NF_tx_mq",
               &nf_tx_msg_pool[0],     //内存池
               sizeof(nf_Send_Message_t),     //每个消息的大小是4字节
               sizeof(nf_tx_msg_pool), //内存池大小
               RT_IPC_FLAG_PRIO);  
	rt_thread_mdelay(500);
	//nf接收模式
	//NF_RX_Model_Config(&nf02,TX_ADDRESS,5);
	TA_Create(&ta_tcb,TA_Pares,(uint8_t *)ta_data_buf,ta_data_buf_size);	
	NF_RX_Model_Config(&nf02,TX_ADDRESS,5);
	//创建解析函数入口			   
	while(1)
	{
		if(rt_mq_recv(&nf_tx_mq,&send_message,sizeof(nf_Send_Message_t),0) == RT_EOK)
		{
			//设置为发送模式
			NF_TX_Model_Config(&nf02,TX_ADDRESS,5);
			
			//发送数据
			NF_Send_Data(&nf02,send_message.data,32);
			NF_RX_Model_Config(&nf02,TX_ADDRESS,5);
		}
		if(!NF_RX_Data(&nf02,nf_data,32))
		{
			rssi=ReadRSSI(&nf02);
//			//nf_data[10]=0;
//			if(nf_data[0]==0xAA)
//			{
//				HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_RESET);
//			}
 			//TA_Decode_Array(&ta_tcb,nf_data,32);
			Dog_Recive();
			HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_RESET);
		}
		//NF_RX_Model_Config(&nf02,TX_ADDRESS,5);
		rt_thread_mdelay(100);
	}
}


void NF_TX_Model_Config(nf_t *nf,uint8_t *address,uint8_t address_len)
{
	nf_config_t nf_config;
	nf_config.crc_config.en_crc = 1;    //CRC使能
	nf_config.crc_config.crco = 1;
	nf_config.rf_ch = 40;
	nf_config.rf_dr = RF_DR_2Mbps;
	nf_config.rf_pwr = RF_PWR_7dBm;
	nf_config.tx_config.address_witdh = 5;
	mymemcpy(nf_config.tx_config.tx_add,address,address_len);
	nf_config.tx_config.retr_arc = 10;
	nf_config.tx_config.retr_ard = 10;    //250us
	
	NF_Set_TX_Model(nf,nf_config);    //设置为发送模式
}

void NF_RX_Model_Config(nf_t *nf,uint8_t *address,uint8_t address_len)
{
	nf_config_t nf_config;
	nf_config.crc_config.en_crc = 1;    //CRC使能
	nf_config.crc_config.crco = 1;
	nf_config.rf_ch = 40;
	nf_config.rf_dr = RF_DR_2Mbps;
	nf_config.rf_pwr = RF_PWR_7dBm;

	nf_config.rx_config.p0.Data_witdh = 32;
	mymemcpy(nf_config.rx_config.rx_add.rx_addr_p0,address,address_len);    //通道0接收地址
	nf_config.rx_config.rx_add.add_width = 5;
	nf_config.rx_config.p0.ENAA = 1;
	nf_config.rx_config.p0.EN_DPL = 1;
	nf_config.rx_config.p0.EN_Rxddr = 1;
	
	nf_config.rx_config.p1.ENAA = 0;
	nf_config.rx_config.p1.EN_DPL = 0;
	nf_config.rx_config.p1.EN_Rxddr = 0;
	
	nf_config.rx_config.p2.ENAA = 0;
	nf_config.rx_config.p2.EN_DPL = 0;
	nf_config.rx_config.p2.EN_Rxddr = 0;
	
	nf_config.rx_config.p3.ENAA = 0;
	nf_config.rx_config.p3.EN_DPL = 0;
	nf_config.rx_config.p3.EN_Rxddr = 0;
	
	nf_config.rx_config.p4.ENAA = 0;
	nf_config.rx_config.p4.EN_DPL = 0;
	nf_config.rx_config.p4.EN_Rxddr = 0;
	
	nf_config.rx_config.p5.ENAA = 0;
	nf_config.rx_config.p5.EN_DPL = 0;
	nf_config.rx_config.p5.EN_Rxddr = 0;
	
	NF_Set_RX_Model(nf,nf_config);    //设置为发送模式
}

/********************
 * 功能：用户发送数据
 * 参数：
********************/
void User_NFSend_Data(uint8_t *add,uint8_t *data,uint8_t len)
{
	nf_Send_Message_t send_data;
	send_data.add=add;
	mymemcpy(send_data.data,data,len);
	rt_mq_send(&nf_tx_mq,&send_data,sizeof(nf_Send_Message_t));
}

uint8_t Send_Data(uint8_t *data,uint8_t len)
{
	uint8_t send_buf[32];
	TA_Protocol protocol;
	if(len>28)
	{
		
	}
	else
	{
		protocol.Package_ID=0x09;
		protocol.FrameType=0x01;
		protocol.Frame_sn=0x01;
		protocol.data_len=len;
		protocol.data=data;
		TA_Package(protocol,send_buf);
		User_NFSend_Data(TX_ADDRESS,send_buf,32);
	}
		
}

